#ifndef NETRADIO_PROTO_H__
#define NETRADIO_PROTO_H__

#include <stdint.h>  // 确保 uint8_t 定义有效

// -------------------------- 基础配置（不变） --------------------------
#define GROUP_ADDR    "239.23.32.99"  // 多播组地址
#define RCV_PORT      6666            // 接收/发送端口（统一）
#define CHN_NUM       200             // 最大支持频道数（冗余，可保留）
#define CHN_LIST_ID   0               // 频道列表标识（首字节必须为0）
#define MIN_CHN_ID    1               // 最小音频频道ID
#define MAX_CHN_ID    (CHN_NUM + MIN_CHN_ID - 1)  // 最大音频频道ID
#define MSG_SIZE      1024            // 音频包最大数据长度（1024字节）

// -------------------------- 基础类型（明确字节长度） --------------------------
typedef uint8_t  chnid_t;  // 频道ID（1字节，确保跨平台一致）
typedef uint8_t  len_t;    // 长度字段（1字节，描述 list_entry 总长度）

// -------------------------- 频道列表条目（单个频道描述） --------------------------
// 关键：添加 __attribute__((packed)) 强制紧凑排列，无内存间隙
struct list_entry {
    chnid_t  chnid;  // 频道ID（如1、2、3）
    len_t    len;    // 当前条目总长度 = sizeof(chnid_t) + sizeof(len_t) + strlen(descr) + 1（含'\0'）
    char     descr[]; // 变长字段：频道描述（以'\0'结尾，如"music"）
} __attribute__((packed));

// -------------------------- 音频数据包结构（单个频道的音频数据） --------------------------
// 关键：紧凑排列，总长度 = 1字节(chnid) + 1024字节(msg) = 1025字节（与抓包一致）
struct chn_data_st {
    chnid_t  chnid;  // 音频所属频道ID（>=1）
    char     msg[MSG_SIZE];  // 音频原始数据（MP3字节流）
} __attribute__((packed));

// -------------------------- 接收数据共用体（客户端判断数据类型） --------------------------
// 关键：紧凑排列，确保首字节永远是 chnid（判断依据）
union chn_recv_st {
    chnid_t        chnid;    // 首字节：判断类型（0=列表，>=1=音频）
    struct list_entry list;   // 若为列表：从首字节后开始解析 list_entry 链
    struct chn_data_st data;  // 若为音频：直接解析为音频包
} __attribute__((packed));

#endif